package com.kevinkk.array;

import java.util.List;
import java.util.ArrayList;

/**
 * 给你一个 m 行 n 列的矩阵 matrix ，请按照 顺时针螺旋顺序 ，返回矩阵中的所有元素。
 *
 * 总的来说这道题就是要模拟整个旋转过程
 * 通过 up、left 、down、right 四个指针，分别表示矩形的每一个边
 * 每移动完一条边之后，对应的边就进行缩小，直到全部遍历完
 */

public class SpiralMatrix {
    class Solution {
        public List<Integer> spiralOrder(int[][] matrix) {
            List<Integer> res = new ArrayList<>();
            int up = 0, left = 0, down = matrix.length - 1, right = matrix[0].length - 1;
            while (true) {
                for (int i = left; i <= right; i++)
                    res.add(matrix[up][i]);
                if (++up > down)
                    break;

                for (int i = up; i <= down; i++)
                    res.add(matrix[i][right]);
                if (--right < left)
                    break;

                for (int i = right; i >= left; i--)
                    res.add(matrix[down][i]);
                if (--down < up)
                    break;

                for (int i = down; i >= up; i--)
                    res.add(matrix[i][left]);
                if (++left > right)
                    break;
            }

            return res;

        }
    }
}
